﻿#pragma once
#include "stdafx1.h"

#include "Source/ProjectModule/Undo/ExtendPart/C_UndoDataBase.h"
#include "Source/ProjectModule/Undo/ExtendPart/C_UndoDataGlobalBase.h"


/*
-----==========================================================-----
		类：		场强探头模块 - 树节点管理.h
		作者：		drill_up
		所属模块：	场强探头模块
		功能：		此类定义该模块所使用的树节点。
					（详细见cpp）
-----==========================================================-----
*/

class S_MonitorTreeManager : public QObject
{
	Q_OBJECT

	public:
		S_MonitorTreeManager();
		~S_MonitorTreeManager();
		static S_MonitorTreeManager* cur_manager;		//单例
		static S_MonitorTreeManager* getInstance();		//单例，获取自己


	//-----------------------------------
	//----树根（场监视器）
	protected:
		QTreeWidgetItem* m_root_FieldMonitor = nullptr;
	public:
									//树根（场监视器） - 树根初始化
									//		【说明】：此函数由 主树 调用，调用后能初始化树根。
		void initRoot_FieldMonitor(QTreeWidget* treeWidget);
									//树根（场监视器） - 获取
		QTreeWidgetItem* getRoot_FieldMonitor();
									//树根（场监视器） - 刷新树根
		void refreshRoot_FieldMonitor();

									//树根（场监视器） - 清空树根
									//		【说明】：树根下所有树枝/叶子全部删除。
		void clearRoot_FieldMonitor();
									//树根（场监视器） - 清空树枝
									//		【说明】：树根下的关键树枝保留，清除所有叶子节点。
		void clearBranch_FieldMonitor();
									//树根（场监视器） - 展开树根
		void setRootExpandAll_FieldMonitor();
									//树根（场监视器） - 折叠树根
		void setRootCollapseAll_FieldMonitor();
	public:
	signals:
									//信号（场监视器） - 树根刷新时
		void signal_rootRefreshed_FieldMonitor();

	//-----------------------------------
	//----树节点事件（场监视器）
	public:
									//树节点事件（场监视器） - 失去焦点时
									//		【说明】：拥有焦点时，失去焦点后才触发；一直没有焦点时不会触发。
		void itemFocusOut_FieldMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（场监视器） - 单击操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemClicked_FieldMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（场监视器） - 改变操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemSelectionChanged_FieldMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（场监视器） - 双击操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemDoubleClicked_FieldMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（场监视器） - 右键操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemRightClicked_FieldMonitor(QList<QTreeWidgetItem*> item_list);

	//-----------------------------------
	//----树节点（场监视器）
	public:
		QList<QTreeWidgetItem*> m_item_FieldMonitor;		//树节点 - 端口列表




	//-----------------------------------
	//----树根（场强探头）
	protected:
		QTreeWidgetItem* m_root_Probes = nullptr;
	public:
									//树根（场强探头） - 树根初始化
									//		【说明】：此函数由 主树 调用，调用后能初始化树根。
		void initRoot_Probes(QTreeWidget* treeWidget);
									//树根（场强探头） - 获取
		QTreeWidgetItem* getRoot_Probes();
									//树根（场强探头） - 刷新树根
		void refreshRoot_Probes();

									//树根（场强探头） - 清空树根
									//		【说明】：树根下所有树枝/叶子全部删除。
		void clearRoot_Probes();
									//树根（场强探头） - 清空树枝
									//		【说明】：树根下的关键树枝保留，清除所有叶子节点。
		void clearBranch_Probes();
									//树根（场强探头） - 展开树根
		void setRootExpandAll_Probes();
									//树根（场强探头） - 折叠树根
		void setRootCollapseAll_Probes();
	public:
	signals :
									//信号（场强探头） - 树根刷新时
		void signal_rootRefreshed_Probes();

	//-----------------------------------
	//----树节点事件（场强探头）
	public:
									//树节点事件（场强探头） - 失去焦点时
									//		【说明】：拥有焦点时，失去焦点后才触发；一直没有焦点时不会触发。
		void itemFocusOut_Probes(QList<QTreeWidgetItem*> item);
									//树节点事件（场强探头） - 单击操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemClicked_Probes(QList<QTreeWidgetItem*> item);
									//树节点事件（场强探头） - 改变操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemSelectionChanged_Probes(QList<QTreeWidgetItem*> item);
									//树节点事件（场强探头） - 双击操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemDoubleClicked_Probes(QList<QTreeWidgetItem*> item);
									//树节点事件（场强探头） - 右键操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemRightClicked_Probes(QList<QTreeWidgetItem*> item);
		
	//-----------------------------------
	//----树节点（场强探头）
	protected:
		QList<QTreeWidgetItem*> m_item_Probes;		//树节点列表
		QStringList m_selectedList_ProbesId;		//选中的树节点列表
	public slots:
									//树节点（场强探头） - 获取树节点
		QTreeWidgetItem* getItem_ProbesById(QString data_id);

									//树节点（场强探头） - 是否有选中ID
		bool hasItemSelectedID_Probes();
									//树节点（场强探头） - 获取选中ID
		QStringList getItemSelectedID_Probes();

									//树节点（场强探头） - 显示数据变化时
									//		【说明】：此函数连接 "数据模型的隐藏" 功能。
		void visibleChanged_Probes(QString data_id, bool visible);
									//树节点（场强探头） - 获取图标
		QIcon getIcon_Probes(bool visible);
	public:
	signals:
									//信号（场强探头） - 树节点选中变化时
		void signal_itemSelectChanged_Probes();



	//-----------------------------------
	//----树根（电压和电流监视器）
	protected:
		QTreeWidgetItem* m_root_VAndCMonitor = nullptr;
	public:
									//树根（电压和电流监视器） - 树根初始化
									//		【说明】：此函数由 主树 调用，调用后能初始化树根。
		void initRoot_VAndCMonitor(QTreeWidget* treeWidget);
									//树根（电压和电流监视器） - 获取
		QTreeWidgetItem* getRoot_VAndCMonitor();
									//树根（电压和电流监视器） - 刷新树根
		void refreshRoot_VAndCMonitor();

									//树根（电压和电流监视器） - 清空树根
									//		【说明】：树根下所有树枝/叶子全部删除。
		void clearRoot_VAndCMonitor();
									//树根（电压和电流监视器） - 清空树枝
									//		【说明】：树根下的关键树枝保留，清除所有叶子节点。
		void clearBranch_VAndCMonitor();
									//树根（电压和电流监视器） - 展开树根
		void setRootExpandAll_VAndCMonitor();
									//树根（电压和电流监视器） - 折叠树根
		void setRootCollapseAll_VAndCMonitor();
	public:
	signals:
									//信号（电压和电流监视器） - 树根刷新时
		void signal_rootRefreshed_VAndCMonitor();
		
	//-----------------------------------
	//----树节点事件（电压和电流监视器）
	public:
									//树节点事件（电压和电流监视器） - 失去焦点时
									//		【说明】：拥有焦点时，失去焦点后才触发；一直没有焦点时不会触发。
		void itemFocusOut_VAndCMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（电压和电流监视器） - 单击操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemClicked_VAndCMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（电压和电流监视器） - 改变操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemSelectionChanged_VAndCMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（电压和电流监视器） - 双击操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemDoubleClicked_VAndCMonitor(QList<QTreeWidgetItem*> item_list);
									//树节点事件（电压和电流监视器） - 右键操作
									//		【说明】：此函数由树控件调用，该模块的树节点被触发时才会进入函数。
		void itemRightClicked_VAndCMonitor(QList<QTreeWidgetItem*> item_list);

	//-----------------------------------
	//----树节点（电压和电流监视器）
	public:
		QList<QTreeWidgetItem*> m_item_VoltageMonitor;		//树节点列表
		QList<QTreeWidgetItem*> m_item_CurrentMonitor;		//树节点列表
		QStringList m_selectedList_VoltageId;				//选中的树节点列表
		QStringList m_selectedList_CurrentId;				//选中的树节点列表
	public slots:
									//树节点（电压和电流监视器） - 获取树节点
		QTreeWidgetItem* getItem_VoltageMonitorById(QString data_id);
		QTreeWidgetItem* getItem_CurrentMonitorById(QString data_id);

									//树节点（电压和电流监视器） - 是否有选中ID
		bool hasItemSelectedID_VoltageMonitor();
		bool hasItemSelectedID_CurrentMonitor();
									//树节点（电压和电流监视器） - 获取选中ID
		QStringList getItemSelectedID_VoltageMonitor();
		QStringList getItemSelectedID_CurrentMonitor();

									//树节点（电压和电流监视器） - 显示数据变化时
									//		【说明】：此函数连接 "数据模型的隐藏" 功能。
		void visibleChanged_VoltageMonitor(QString data_id, bool visible);
		void visibleChanged_CurrentMonitor(QString data_id, bool visible);
									//树节点（电压和电流监视器） - 获取图标
		QIcon getIcon_VoltageMonitor(bool visible);
		QIcon getIcon_CurrentMonitor(bool visible);
	public:
	signals:
									//信号（电压监视器） - 树节点选中变化时
		void signal_itemSelectChanged_VoltageMonitor();
	public:
	signals:
									//信号（电流监视器） - 树节点选中变化时
		void signal_itemSelectChanged_CurrentMonitor();



	//-----------------------------------
	//----数据容器
	public slots:
									//数据容器 - 树变化 - 某数据 被添加
		void containerDataAdded(C_UndoDataBasePtr ptr, int index);
									//数据容器 - 树变化 - 某数据 被修改
		void containerDataModifyed(C_UndoDataBasePtr ptr, int index);
									//数据容器 - 树变化 - 某数据 被删除
		void containerDataDeleted(C_UndoDataBasePtr ptr, int index);
									//数据容器 - 树变化 - 某全局数据 被修改
		void containerGlobalDataModifyed(C_UndoDataGlobalBasePtr ptr);
									//数据容器 - 树变化 - 存储数据 被读取
		void containerDataAllReloaded();
};